package com.core.utils;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;

import javax.imageio.ImageIO;

import sun.misc.BASE64Encoder;

public class DataConvertKit {
	/**
	 * 将以时分秒计时的时间换算为秒
	 */
    public static int callPeriodConvert(String source){
        String[] times = source.split("\\D");
        int count = 1;
        int result = 0;
        for(int i = times.length-1;i>=0;i--){
            if(!times[i].isEmpty()) {
                result += Integer.parseInt(times[i]) * count;
                count*=60;
            }
        }
        return result;
    }
    /**
     * 得到当前月份与addToCurrent相加之后的月份，并返回以format格式格式化后的新日期字符串
     */
    public static String getMonth(int addToCurrent , String format){
    	Calendar calendar = new GregorianCalendar();
    	calendar.add(Calendar.MONTH, addToCurrent);
    	DateFormat format1 = new SimpleDateFormat(format);
    	return format1.format(calendar.getTime());
    }
    /**
     * 将原以sourceFormat格式的source日期字符串，转换为targetFormat格式的新日期字符串并返回
     */
    public static String parseDateFormat(String source , String sourceFormat , String targetFormat){
    	DateFormat format1 = new SimpleDateFormat(sourceFormat);
    	DateFormat format2 = new SimpleDateFormat(targetFormat);
    	try {
			return format2.format(format1.parse(source));
		} catch (ParseException e) {
			e.printStackTrace();
		}
    	return null;
    }
    /**
     * 得到以monthPattern为格式的monthStr年份月份字符串的月份开始日期，并以targetPattern为格式格式化返回的日期字符串
     */
    public static String getMonthStartDate(String monthStr , String monthPattern, String targetPattern) throws ParseException{
    	DateFormat sourceFormat = new SimpleDateFormat(monthPattern+"dd");
		return new SimpleDateFormat(targetPattern).format(sourceFormat.parse(monthStr+"01"));
    }
    /**
     * 将{@link Date}类型的日期转换为以pattern为格式的日期字符串并返回
     */
    public static String formatDate(Date date , String pattern){
    	return new SimpleDateFormat(pattern).format(date);
    }
    /**
     * 根据以pattern为格式的日期字符串dateStr，得到{@link Date}类型对象并返回
     */
    public static Date parseDate(String dateStr , String pattern){
    	try {
			return new SimpleDateFormat(pattern).parse(dateStr);
		} catch (ParseException e) {
			e.printStackTrace();
		}
    	return null;
    }
    /**
     * 根据monthPattern格式的年月份monthStr，得到targetPattern的月末日期的字符串，
     * 如果todayIsMaxDayOfCurrentMonth为true，并且monthStr是当前月份，则当前日期为当前月份的最大日期
     */
    public static String getMonthEndDate(String monthStr , String monthPattern, String targetPattern ,boolean todayIsMaxDayOfCurrentMonth) throws ParseException{
    	Calendar calendar = new GregorianCalendar();
    	String currentMonth = new SimpleDateFormat(monthPattern).format(calendar.getTime());
    	DateFormat targetFormat = new SimpleDateFormat(targetPattern);
    	if(currentMonth.equals(monthStr) && todayIsMaxDayOfCurrentMonth){
    		return targetFormat.format(calendar.getTime());
    	}
    	DateFormat sourceFormat = new SimpleDateFormat(monthPattern+"dd");
    	Date date = sourceFormat.parse(monthStr+"01");
    	calendar.setTime(date);
    	calendar.add(Calendar.MONTH, 1);
    	calendar.add(Calendar.DATE, -1);
    	return new SimpleDateFormat(targetPattern).format(calendar.getTime());
    }
    
    /**
     * 将以:为间隔符的时分秒转换为以 '小时','分','秒'为单位的时分秒
     */
    public static String parseTime2String(String time){
    	String[] timeArray = time.split(":");
    	StringBuffer sb = new StringBuffer();
    	if(!timeArray[0].equals("0") && !timeArray[0].equals("00"))
    		sb.append(timeArray[0]+"小时");
    	if(!timeArray[1].equals("0") && !timeArray[1].equals("00"))
    		sb.append(timeArray[1]+"分");
    	sb.append(timeArray[2]+"秒");
    	return sb.toString();
    }
    /**
     * 将second秒转换为最大单位为小时的 '小时，分，秒'字符串
     */
    public static String parseSecond2String(int second){
    	StringBuilder sb = new StringBuilder();
    	int i = 0;
    	if((i = second/3600) > 0)
    		sb.append(i).append("小时");
    	if((i = ((second%3600)/60)) > 0)
    		sb.append(i).append("分");
    	sb.append(second%60).append("秒");
    	return sb.toString();
    }
    
    /**
     * 得到{@link BufferedImage}类型 bi的Base64编码字符串
     */
    public static String getBase64EncodedURL(BufferedImage bi){
    	BASE64Encoder encoder = new BASE64Encoder();
    	ByteArrayOutputStream baos = new ByteArrayOutputStream();
    	byte[] bytes = null;
    	try {
			ImageIO.write(bi, "jpg", baos);
			bytes = baos.toByteArray();
	    	baos.flush();
	    	baos.close();
		} catch (IOException e) {
			e.printStackTrace();
			return null;
		}
    	return encoder.encode(bytes);
    }
    
    /**
     * 根据比较器对列表进行排序，如果列表大小超过限制，则cut列表大小至最大限制
     */
    public static <T> void sortAndCutList(List<T> list , Comparator<T> comparator , int maxSize){
    	Collections.sort(list, comparator);
    	if(list.size() > maxSize){
    		list.subList(maxSize , list.size()).clear();
    	}
    }
}
